#coding=utf-8
#!/usr/bin/python

'''
Created on 2012-11-17

@author: Neo.Chen
'''

# 常用数据类型转换方式
# bytes object   b = b"example \xa6\xc7"
# str object   s = "example"
# unicode string object s = u"example"
#

'''
类型转换

 1 函数                      描述
 2 int(x [,base ])         将x转换为一个整数
 3 long(x [,base ])        将x转换为一个长整数
 4 float(x )               将x转换到一个浮点数
 5 complex(real [,imag ])  创建一个复数
 6 str(x )                 将对象 x 转换为字符串
 7 repr(x )                将对象 x 转换为表达式字符串
 8 eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象
 9 tuple(s )               将序列 s 转换为一个元组
10 list(s )                将序列 s 转换为一个列表
11 chr(x )                 将一个整数转换为一个字符
12 unichr(x )              将一个整数转换为Unicode字符
13 ord(x )                 将一个字符转换为它的整数值
14 hex(x )                 将一个整数转换为一个十六进制字符串
15 oct(x )                 将一个整数转换为一个八进制字符串


序列操作

1 操作                      描述
 2 s + r                   序列连接
 3 s * n , n * s           s的 n 次拷贝,n为整数
 4 s % d                   字符串格式化(仅字符串)
 5 s[i]                    索引
 6 s[i :j ]                切片
 7 x in s , x not in s     从属关系
 8 for x in s :            迭代
 9 len(s)                  长度
10 min(s)                  最小元素
11 max(s)                  最大元素
12 s[i ] = x               为s[i]重新赋值
13 s[i :j ] = r            将列表片段重新赋值
14 del s[i ]               删除列表中一个元素
15 del s[i :j ]            删除列表中一个片段

数值操作

1 x << y                  左移
 2 x >> y                  右移
 3 x & y                   按位与
 4 x | y                   按位或
 5 x ^ y                   按位异或 (exclusive or)
 6 ~x                      按位翻转
 7 x + y                   加
 8 x - y                   减
 9 x * y                   乘
10 x / y                   常规除
11 x // y                  地板除
12 x ** y                  乘方 (xy )
13 x % y                   取模 (x mod y )
14 -x                      改变操作数的符号位
15 +x                      什么也不做
16 ~x                      ~x=-(x+1)
17 abs(x )                 绝对值
18 divmod(x ,y )           返回 (int(x / y ), x % y )
19 pow(x ,y [,modulo ])    返回 (x ** y ) x % modulo
20 round(x ,[n])           四舍五入，n为小数点位数
21 x < y                   小于
22 x > y                   大于
23 x == y                  等于
24 x != y                  不等于(与<>相同)
25 x >= y                  大于等于
26 x <= y                  小于等于
'''


import ktlib
import string
import struct

#参考资料 http://blog.csdn.net/summerhust/article/details/6739241
####################################
def _int8ToStr(n):
    s = struct.pack("!b", n);
    return s
def _uint8ToStr(n):
    s = struct.pack("!B", n);
    return s
def _int16ToStr(n):
    s = struct.pack("!h", n);
    return s
def _uint16ToStr(n):
    s = struct.pack("!H", n);
    return s
def _int32ToStr(n):
    s = struct.pack("!i", n);
    return s
def _uint32ToStr(n):
    s = struct.pack("!I", n);
    return s
def _int64ToStr(n):
    s = struct.pack("!q", n);
    return s
def _uint64ToStr(n):
    s = struct.pack("!Q", n);
    return s

def int2bytes(n, length):
    if length == 1:
        b = _uint8ToStr(n)
    elif length == 2:
        b = _uint16ToStr(n)
    elif length == 4:
        b = _uint32ToStr(n)
    else:
        b = _uint64ToStr(n)
    return b


######################
def _strToInt8(s):
    n = struct.unpack("!b", s[0:1]);
    return n[0]
def _strToUint8(s):
    n = struct.unpack("!B", s[0:1]);
    return n[0]
def _strToInt16(s):
    n = struct.unpack("!h", s[0:2]);
    return n[0]
def _strToUint16(s):
    n = struct.unpack("!H", s[0:2]);
    return n[0]
def _strToInt32(s):
    n = struct.unpack("!i", s[0:4]);
    return n[0]
def _strToUint32(s):
    n = struct.unpack("!I", s[0:4]);
    return n[0]
def _strToInt64(s):
    n = struct.unpack("!q", s[0:8]);
    return n[0]
def _strToUint64(s):
    n = struct.unpack("!Q", s[0:8]);
    return n[0]

def bytes2int(b, length):
    if length == 1:
        n = _strToUint8(b)
    elif length == 2:
        n = _strToUint16(b)
    elif length == 4:
        n = _strToUint32(b)
    else:
        n = _strToUint64(b)
    return n


######################
#字符串转字节
def str2bytes_py3(s):
    b = bytes(s, encoding = "utf8")
    return b

#字符串转字节(方法2)
def str2bytes(s):
    b = str.encode(s)
    return b

#字符串转字节(方法3)
def str2bytes_type3(s):
    b = s.encode()
    return b

#字节转字符串
def bytes2str_py3(b):
    s = str(b, encoding = "utf-8")
    return s

#字节转字符串(方法2)
def bytes2str(b):
    s = bytes.decode(b)
    return s

#字节转字符串(方法3)
def bytes2str_type3(b):
    s = b.decode()
    return s


#整数转字节
def int2bytes_py3(n):
    b = n.to_bytes(4, byteorder='big')
    return b

#字节转整数
def bytes2int_py3(b):
    n = int.from_bytes(b, byteorder='big')
    return n

#字符串转浮点数
def str2float(s):
    f = 0.0
    try:    #由于字符串不一定是纯数字的，所以要异常捕获，避免崩溃
        f = string.atof(s)
    except:
        pass
    return f

#字符串转整数
def str2int(s):
    n = 0
    try:    #由于字符串不一定是纯数字的，所以要异常捕获，避免崩溃
        n = string.atoi(s)
    except:
        pass
    return n

##################################################################################


def main():
    if ktlib.IsPy3():
        b = str2bytes_py3("3.13")
        print(b)
    b = str2bytes("3.13")
    print(b)
    b = str2bytes_type3("3.13")
    print(b)

    if ktlib.IsPy3():
        s = bytes2str_py3(b)
        print(s)
    s = bytes2str(b)
    print(s)
    s = bytes2str_type3(b)
    print(s)

    if ktlib.IsPy3():
        bn = int2bytes_py3(333)
        print(bn)
        nb = bytes2int_py3(bn)
        print(nb)

    f = str2float("3.14")
    print(f)
    n = str2int("56")
    print(n)

    b = int2bytes(200, 1)
    n = bytes2int(b, 1)
    n = 0

if __name__ == '__main__':
    main()



















